#include <iostream>
using namespace std;

class buffer_t {
  private:
    int *data; // 指向动态分配内存的指针
    int  size; // 缓冲区大小

  public:
    buffer_t(int s); // 构造函数声明
    buffer_t(const buffer_t &other); // 拷贝构造函数声明
    buffer_t &operator=(const buffer_t &other); // 赋值操作符声明
    ~buffer_t(); // 析构函数声明
};

// 构造函数实现
buffer_t::buffer_t(int s) : size(s)
{
    data = new int[size]; // 分配内存
    cout << "构造函数: 分配了 " << size << " 个int空间" << endl;
}

// 拷贝构造函数实现
buffer_t::buffer_t(const buffer_t &other) : size(other.size)
{
    data = new int[size]; // 分配新内存
    for (int i = 0; i < size; i++)
    {
        data[i] = other.data[i]; // 拷贝数据
    }
    cout << "拷贝构造: 拷贝了 " << size << " 个int数据" << endl;
}

// 赋值操作符实现
buffer_t &buffer_t::operator=(const buffer_t &other)
{
    // 检查自赋值
    if (this == &other)
    {
        cout << "检测到自赋值，跳过操作" << endl;
        return *this;
    }

    delete[] data; // 释放原有内存

    size = other.size;    // 设置新大小
    data = new int[size]; // 分配新内存
    for (int i = 0; i < size; i++)
    {
        data[i] = other.data[i]; // 拷贝数据
    }
    cout << "赋值操作: 拷贝了 " << size << " 个int数据" << endl;
    return *this; // 返回当前对象引用
}

// 析构函数实现
buffer_t::~buffer_t()
{
    delete[] data; // 释放内存
    cout << "析构函数: 释放了 " << size << " 个int空间" << endl;
}

int main()
{
    buffer_t buf1(5); // 创建第一个缓冲区
    buffer_t buf2(5); // 创建第二个缓冲区

    buf2 = buf1; // 正常赋值操作
    buf2 = buf2; // 自赋值操作

    return 0;
}
